<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="zh" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="DC.Type" content="concept"/>
<meta name="DC.Title" content="Lucene的总体架构与代码"/>
<meta name="DC.subject" content="Apache, Lucene, 指南, OSSEZ, OSS 计算技术"/>
<meta name="keywords" content="Apache, Lucene, 指南, OSSEZ, OSS 计算技术"/>
<meta name="DC.Relation" scheme="URI" content="../../tasks/chapter02/chapter02_01.html"/>
<meta name="DC.Relation" scheme="URI" content="../../tasks/chapter02/chapter02_02.html"/>
<meta name="DC.Relation" scheme="URI" content="../../tasks/chapter02/chapter02_03.html"/>
<meta name="prodname" content="Lucene 指南"/>
<meta name="version" content="1.0.0.0"/>
<meta name="brand" content="OSSEZ APACHE LUCENE"/>
<meta name="copyright" content="OSSEZ (中国) 信息技术有限公司 2006, 2012" type="primary"/>
<meta name="DC.Rights.Owner" content="OSSEZ (中国) 信息技术有限公司 2006, 2012" type="primary"/>
<meta name="DC.Format" content="XHTML"/>
<meta name="DC.Identifier" content="chapter01"/>
<meta name="DC.Language" content="zh"/>
<link rel="stylesheet" type="text/css" href="../../css/commonltr.css"/>
<link rel="stylesheet" type="text/css" href="../../css/public.css"/>
<title>Lucene的总体架构与代码</title>
<svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/constants.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/diagram.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/sequence.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/loop.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/decision.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/revdecision.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/boxed.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/unboxed.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/text.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/void.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/notecontainer.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/note.js"/><svg:script xmlns:syntaxdiagram-svg="http://www.moldflow.com/2006/syntaxdiagram-svg" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" type="text/ecmascript" xlink:href="../../js/main.js"/><link rel="stylesheet" type="text/css" href="css/syntaxdiagram.css"/></head>
<body id="chapter01">


  <h1 class="title topictitle1">Lucene的总体架构与代码</h1>

  
  <div class="body conbody">
    <p class="p">Lucene 总体来说是</p>

    <div class="p"><ul class="ul">
        <li class="li">一个高效的，可扩展的，全文检索库。</li>

        <li class="li">全部用Java 实现，无须配置。</li>

        <li class="li">仅支持纯文本文件的索引(Indexing)和搜索(Search)。</li>

        <li class="li">不负责由其他格式的文件抽取纯文本文件，或从网络中抓取文件的过程。</li>

      </ul>
</div>

    <p class="p">Lucene 是有索引和搜索的两个过程，包含索引创建，索引，搜索三个要点。</p>

    <p class="p"><img class="image" src="../../images/chapter02_image01.png" alt="索引结构"/></p>

    <div class="p"><ul class="ul">
        <li class="li">被索引的文档用Document对象表示。</li>

        <li class="li">IndexWriter通过函数addDocument将文档添加到索引中，实现创建索引的过程。</li>

        <li class="li">Lucene的索引是应用反向索引。</li>

        <li class="li">当用户有请求时，Query代表用户的查询语句。</li>

        <li class="li">IndexSearcher通过函数search搜索Lucene Index。</li>

        <li class="li">IndexSearcher计算term weight和score并且将结果返回给用户。</li>

        <li class="li">返回给用户的文档集合用TopDocsCollector表示。</li>

      </ul>
</div>

    <p class="p">那么如何应用这些组件呢？</p>

    <p class="p">让我们再详细到对Lucene API 的调用实现索引和搜索过程。</p>

    <p class="p"><img class="image" src="../../images/chapter02_image02.png" alt="索引过程"/></p>

    <p class="p">索引过程如下</p>

    <div class="p"><ol class="ol">
        <li class="li">创建一个IndexWriter 用来写索引文件，它有几个参数，INDEX_DIR 就是索引文件所存放的位置，Analyzer 便是用来对文档进行词法分析和语言处理的。</li>

        <li class="li">创建一个Document 代表我们要索引的文档。</li>

        <li class="li">将不同的Field 加入到文档中。我们知道，一篇文档有多种信息，如题目，作者，修改时间，内容等。不同类型的信息用不同的Field 来表示，在本例子中，一共有两类信息进行了索引，一个是文件路径，一个是文件内容。其中FileReader 的SRC_FILE 就表示要索引的源文件。</li>

        <li class="li">IndexWriter 调用函数addDocument 将索引写到索引文件夹中。</li>

      </ol>
</div>

    <p class="p">搜索过程如下</p>

    <div class="p"><ol class="ol">
        <li class="li">IndexReader 将磁盘上的索引信息读入到内存，INDEX_DIR 就是索引文件存放的位置。</li>

        <li class="li">创建IndexSearcher 准备进行搜索。</li>

        <li class="li">创建Analyer 用来对查询语句进行词法分析和语言处理。</li>

        <li class="li">创建QueryParser 用来对查询语句进行语法分析。</li>

        <li class="li">QueryParser 调用parser 进行语法分析，形成查询语法树，放到Query 中。</li>

        <li class="li">IndexSearcher 调用search 对查询语法树Query 进行搜索，得到结果 TopScoreDocCollector。</li>

      </ol>
</div>

    <p class="p">以上便是Lucene API 函数的简单调用。</p>

    <p class="p">然而当进入Lucene 的源代码后，发现Lucene 有很多包，关系错综复杂。</p>

    <p class="p">我们不难发现，Lucene 的各源码模块，都是对普通索引和搜索过程的一种实现。</p>

    <div class="p"><ul class="ul">
        <li class="li">Lucene 的 analysis 模块主要负责词法分析及语言处理而形成Term。</li>

        <li class="li">Lucene 的 index 模块主要负责索引的创建，里面有IndexWriter。</li>

        <li class="li">Lucene 的 store 模块主要负责索引的读写。</li>

        <li class="li">Lucene 的 QueryParser 主要负责语法分析。</li>

        <li class="li">Lucene 的 search 模块主要负责对索引的搜索。</li>

        <li class="li">Lucene 的 search 模块主要负责对索引的搜索。</li>

      </ul>
</div>

    <p class="p"><a class="xref" href="http://www.ossez.com/forum.php?mod=viewthread&amp;tid=18388&amp;fromuid=426" target="_blank">http://www.ossez.com/forum.php?mod=viewthread&amp;tid=18388&amp;fromuid=426</a></p>

    <p class="p"><a class="xref" href="http://www.ossez.com/forum.php?mod=forumdisplay&amp;fid=28" target="_blank">OSS - 全文检索 / 论坛</a></p>

  </div>

<div class="related-links">
<ul class="ullinks">
<li class="link ulchildlink"><strong><a href="../../tasks/chapter02/chapter02_01.html">Lucene的索引文件格式</a></strong><br/>
</li>
<li class="link ulchildlink"><strong><a href="../../tasks/chapter02/chapter02_02.html">Lucene的基本类型</a></strong><br/>
</li>
<li class="link ulchildlink"><strong><a href="../../tasks/chapter02/chapter02_03.html">Lucene的基本规则</a></strong><br/>
</li>
</ul>
</div>

</body>
</html>